package club.kingyin.kyblog.core.utils.log;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * <p>
 *   方法执行器，占有重要的地位，决定了每个切点将要执行的方法，
 *   对于某些方法可能需要一些辅助性增强，例入缓存，必须要填充
 *   一个Redis连接，详细查看{@link AbstractLogAspect}
 * </p>
 *
 * <p>
 *     afterPostProcessor 仅返回方法执行时产生的日志信息，封装
 *     在{@link LogResult}
 * </p>
 * @author ：kingyin
 * @date ：创建于 2021/8/14 7:06 下午
 * @description ：调用增强器
 * @modified By：九命可
 * @version: 1.0.0
 */
public interface ExecutePostProcessor<T> {

    /**
     * 方法执行函数
     * 默认实现是直接调用 {@link ProceedingJoinPoint}原始方法
     * 默认handler为空，不需要辅助处理
     * @param point 原始切点
     * @param handler 辅助处理器
     * @return 返回调用结果
     * @throws Throwable 执行方法异常
     */
    default Object execute(ProceedingJoinPoint point, T handler) throws Throwable {
        return point.proceed();
    }

    /**
     * 指定日志注入
     * 发生在属性填充后，后置处理器前
     * @return 返回日志信息
     */
    default Object afterPostProcessor() {
        return null;
    }
}
